package com.sistema.teste;


/**
*
* 
* @author leand
* 
*/

import com.sistema.produtos.Produto;
import com.sistema.util.HibernateUtil;

import java.util.Date;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.*;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;



public class ProdutoTeste 
{
private static Session sessao ;
private static Transaction transacao ;


@BeforeClass
public static void abreConexao()
{
  sessao=HibernateUtil.getSessionFactory().getCurrentSession();
  transacao=sessao.beginTransaction();
}

@AfterClass
public static void fechaConexao()
{


try
{transacao.commit();
    
    }

catch( Throwable e)
        {
            System.out.println("problema na commit" + e);
        }
finally
{
	try
	{
		if (sessao.isOpen())
    {
        sessao.close();
	}
		}
	catch(Exception e2)
	{
		System.out.println("Erro ao fechar conexão : "+e2.getMessage());
	}
	}

}

@Before
public void setup()
{
	
	Produto p1 = new Produto("cx/30","Borracha 30",new Date(),10,8.5f);
	Produto p2 = new Produto("pct/50","regua plastica 30cm",new Date(),30,2.5f);
	Produto p3 = new Produto("pct/2","caderno univ 120fls",new Date(),50,12.8f);
	Produto p4 = new Produto("cx/20","caneta azul",new Date(),250,24.5f);
	Produto p5 = new Produto("cx/40","lapis preto n2",new Date(),30,10.3f);
	
     sessao.save(p1);
     sessao.save(p2);
     sessao.save(p3);
     sessao.save(p4);
     sessao.save(p5);


}

@After
public void limparBase () 
{
		Criteria lista = sessao.createCriteria(Produto.class);
		
		@SuppressWarnings("unchecked")
		List<Produto> produtos = 	lista.list();
		 
		for (Produto produto :produtos) 
		{
			sessao.delete(produto);
		}
		
	
	}

@Test
public void salvarProdutoTeste()
{
	Query consulta = consulta("Borr");
	
	Produto produtoPesquisado =(Produto) consulta.uniqueResult();
	
	
	assertEquals("cx/30",produtoPesquisado.getUnidade());
	

}

private Query consulta(String parametro) {
	String sql="from Produto p where p.descricao like :descricao";
	Query consulta = sessao.createQuery(sql);
	consulta.setString("descricao" , "%"+parametro+"%");
	return consulta;
}
	@Test
	public void deletarProdutoteste()
	{ Query consulta= consulta("Cad");
	
	Produto produtoDeletado=(Produto) consulta.uniqueResult();
	
	sessao.delete(produtoDeletado);
	
	produtoDeletado = (Produto) consulta.uniqueResult();
	
	
		assertNull(produtoDeletado);
	}
	public void alterarProdutoteste()
	{
		Query consulta=consulta("lapis");
		 
		Produto produtoAlterado=(Produto) consulta.uniqueResult();
		 
		produtoAlterado.setEstoque(100);
		
		sessao.update(produtoAlterado);
		
		produtoAlterado = (Produto) consulta.uniqueResult();
		
		assertEquals(100,produtoAlterado.getEstoque().intValue());
	
		
		
	}
	
	public void listarProdutoteste()
	{
		Criteria lista = sessao.createCriteria(Produto.class);
		
		@SuppressWarnings("unchecked")
		List<Produto> produtos= lista.list();
		
		assertEquals(5,produtos.size());
		
		
		
		
	}







}